iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
AI & Data

PyTorch 生態鏈實戰運用系列 第 14

[Day14] 資料預處理機制與優化 - 軟體篇 - 優化預處理

  • 分享至 

  • xImage
  •  

前言

前一日的文章,以硬體面討論了訓練的效率。但有了適當的硬體以後,要如何利用軟體去使用這些硬體呢?從今天開始的幾天內將介紹一些優化的方式。

資料預處理機制

先複習一下,上一篇文章內說的訓練流程:

今天將以橫向及縱向的兩種方向,來介紹增加Preprocess的方法,分別是:

  1. multiprocessing
  2. prefetch

multiprocessing

正常情形的程式,其實都是使用單一個執行序(thread)在執行程式。但在某些情況下,有些任務是可以被平行處理(詳見平行計算)進而加快計算效率的。

例如,資料的預處理就是個很好的例子。以影像為例,每一張影像我們需要讀取、解碼、然後進行前處理,這是一個執行序能為我們做到的事情。那理論上而言,在同一時間單位下,有多少個的執行序,便能完成多少倍的資料預處理(但實際上會有個增幅極限,因為考慮到storage、cpu以及ram在單位時間內的存取極限),大致上概念上就會是下圖的模樣:

Prefetch

另一個可以考量的方式則是,GPU計算跟CPU前處理都需要時間對吧?那麼如果CPU前處理時,GPU閒置,GPU處理時,CPU閒置。這樣不是很浪費嗎?(慣老闆心態...)

Prefetch(或許可以譯作預取?),便是一個更加利用資源的方式。在GPU計算時,讓原本閒置的CPU先行進行下一個批次計算需要用到的預處理,透過同時壓榨CPU與GPU的計算能力來增加效能。概念大概就會長得像下面這張圖:

另外可以參考這篇文章,裡頭有以下這張動態圖,讓人更好理解Prefetch能增加多少效率:

該怎麼做?

說的嘴巴都泡,但具體怎麼做呢?所幸,歸功於強大的社群功能,Torch內的DataLoader已經同時實作了這兩樣東西。參考官方文件,可以透過其中下列的參數進行設置:

  • num_workers:設置多少subprocess來平行進行資料預處理,0表示僅有主程式進行。
  • prefetch_factor:表示每一個worker會進行多少batch的prefetch。

具體實例如下:

torch.utils.data.DataLoader(dataset,
                            num_workers = 8,
                            prefetch_factor = 4)

實際差異

那麼實際差異到底有多少呢?讓我們實際各跑5個epoch比較看看。實驗結果如下表

進行了平行預處理以及prefetch的結果是原本的43%(245ms/579ms)唷!詳細設置可以參考無優化以及有優化的這兩個commit。

本日小節

  • 用軟體壓榨硬體獲得比較好的效率
  • 畫圖很辛苦(?)

上一篇
[Day13] 資料預處理機制與優化 - 硬體篇
下一篇
[Day15] 資料預處理機制與優化 - 軟體篇 - 空間換取時間
系列文
PyTorch 生態鏈實戰運用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言